package com.meeruu.sg.account.core.domain.mapper;

import com.meeruu.sg.account.core.api.dto.response.KanBanResponseDTO;
import com.meeruu.sg.account.core.domain.model.KanBanResponse;
import com.meeruu.sg.account.core.domain.model.UserAccountDO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author yangqintao
 * @date 2019-05-16
 */
public interface UserAccountMapper {

    /**
     * 开户
     *
     * @param userAccount 用户账户信息
     */
    void insert(@Param("userAccount") UserAccountDO userAccount);

    int insertBatch(@Param("userAccounts") List<UserAccountDO> userAccounts);

    int closeAccount(@Param("userCode") String userCode, @Param("accountType") Integer accountType);

    int closeAccountBatch(@Param("userCodes") List<String> userCode, @Param("accountType") Integer accountType);

    /**
     * 根据accountId获取用户（悲观锁）
     */
    UserAccountDO selectByAccountIdForUpdate(@Param("accountId") String accountId);


    /**
     * 更新账户金额
     *
     * @param availableBalance 可用余额更新
     * @param frozenBalance    冻结金额更新
     * @param totalBalance     总金额更新
     * @param accountId        账户id
     * @param beginBalance     更新前可用余额
     */
    void updateAmount(@Param("availableBalance") BigDecimal availableBalance,
                      @Param("frozenBalance") BigDecimal frozenBalance,
                      @Param("totalBalance") BigDecimal totalBalance,
                      @Param("accountId") String accountId,
                      @Param("beginBalance") BigDecimal beginBalance);

    int transferIn(@Param("accountId") String accountId, @Param("amount") BigDecimal amount);

    /**
     * 账户状态更新
     *
     * @param status    更新后状态
     * @param accountId 账户id
     */
    void updateStatus(@Param("status") Integer status, @Param("accountId") String accountId);


    void updateStatusByUserCode(@Param("status") Integer status, @Param("userCode") String userCode, @Param("desc") String desc);

    /**
     * 根据accountId获取用户
     */
    UserAccountDO selectByAccountId(@Param("accountId") String accountId);

    List<UserAccountDO> listByAccountTypeAndCode(@Param("userCode") String userCode, @Param("accountType") Integer accountType);

    List<UserAccountDO> listByAccountTypeAndAccountIds(@Param("list") List<String> accountIds, @Param("accountType") Integer accountType);


    /**
     * 查询账户
     *
     * @param userCode    用户唯一code
     * @param accountType 账户类型
     */
    UserAccountDO selectByUserCodeAndType(@Param("userCode") String userCode, @Param("accountType") Integer accountType);

    /**
     * 条件查询账户列表
     *
     * @param query     查询条件
     * @param startTime 开户起始时间
     * @param endTime   开户结束时间
     * @return
     */
    List<UserAccountDO> selectByExample(@Param("query") UserAccountDO query, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据userCode、accountType批量查询
     *
     * @param userCodeGroup 用户编码集
     * @param accountType   账户类型
     * @return
     */
    List<UserAccountDO> selectByUserCodeGroupAndType(@Param("userCodeGroup") List<String> userCodeGroup, @Param("accountType") Integer accountType);

    /**
     * 看板数据统计
     * @return
     */
    List<KanBanResponse> kanbanStatistics();
}
